home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 1997 #1
/
Amiga Plus CD - 1997 - No. 01.iso
/
pd
/
programmierung
/
proasm
/
routines
/
gtfsupport.r
< prev
next >
Wrap
Text File
|
1993-10-25
|
14KB
|
850 lines
;---; gtfsupport.r ;---------------------------------------------------------
*
* **** VARIOUS GTFACE SUPPORT ROUTINES ****
*
* Author Stefan Walter
* Version 1.03
* Last Revision 23.10.93
* Notes demands calls with CALL_ macro
* Identifier gfs_defined
* Prefix gfs_ (GTFace support)
* ¯ ¯ ¯
* Functions AllocLVNode, AllocLVNodeRaw, FreeLVNode
* AddHeadLVNode, AddTailLVNode, RemHeadLVNode
* RemTailLVNode, RemoveLVNode, FreeLVList.
*
* SetGadgetTag,SetLVLabels,RemoveLVLabels,
* ChangeLVLabels, SetCYActive, GetLVLabels
* ActivateGadget, OnMenu, OffMenu, FindLVNode,
* FindLVNodeMsg.
*
* StringHistoryHookFunction
*
;------------------------------------------------------------------------------
;------------------
ifnd gfs_defined
gfs_defined =1
;------------------
; Some macros.
;
include basicmac.r
include tasktricks.r
;------------------------------------------------------------------------------
*
* AllocLVNodeRaw Allocate a listview node due to a string generated
* with RawDoFmt(). The string is copied.
*
* INPUT: a0 Format string.
* a1 Raw data.
* d0 Number of bytes to add after node structure.
*
* RESULT: d0 Node or 0.
* a0 Node or 0.
* ccr On d0.
*
;------------------------------------------------------------------------------
;------------------
IFD xxx_AllocLVNodeRaw
AllocLVNodeRaw:
;------------------
; Start.
;
\start: movem.l d1-d7/a1-a6,-(sp)
move.l d0,d5
move.l a0,a3
move.l a1,a4
DoRawCnt_
add.l d5,d0
moveq #14,d1
add.l d1,d0
moveq #1,d1 ;even VMem allowed!
swap d1 ;clear!
move.l 4.w,a6
jsr -198(a6) ;AllocMem()
tst.l d0
beq.s \done
move.l d0,a2
move.l a3,a0
move.l a4,a1
lea 14(a2,d5.l),a3
move.l a3,10(a2)
DoRaw_
\done: move.l d0,a0
movem.l (sp)+,d1-d7/a1-a6
rts
ENDIF
;------------------
;------------------------------------------------------------------------------
*
* AllocLVNode Allocate a listview node. The node will contain a selected
* number of bytes after the node structure and a string that is
* copied.
*
* INPUT: a0 String (will appear in the listview gadget).
* d0 Number of bytes to add after node structure.
*
* RESULT: d0 Node or 0.
* a0 Node or 0
* ccr On d0.
*
;------------------------------------------------------------------------------
;------------------
IFD xxx_AllocLVNode
AllocLVNode:
;------------------
; Start.
;
\start: movem.l d1-d7/a1-a6,-(sp)
move.l a0,a2
move.l d0,d7
moveq #14,d0 ;LN_SIZEOF
add.l d7,d0 ;+ desired number of bytes
\loop: addq.l #1,d0 ;+ string size
tst.b (a0)+
bne.s \loop
moveq #1,d1 ;even VMem allowed!
swap d1 ;clear!
move.l 4.w,a6
jsr -198(a6) ;AllocMem()
tst.l d0
beq.s \done
move.l d0,a0
lea 14(a0,d7.l),a1
move.l a1,10(a0)
\loop2: move.b (a2)+,(a1)+ ;copy string...
bne.s \loop2
tst.l d0
\done: move.l d0,a0
movem.l (sp)+,d1-d7/a1-a6
rts
ENDIF
;------------------
;------------------------------------------------------------------------------
*
* FreeLVList Remove the entier listview list and free all nodes.
*
* INPUT: a0 List.
* a2 WindowKey.
* a3 Gadget.
*
;------------------------------------------------------------------------------
;------------------
IFD xxx_FreeLVList
FreeLVList:
;------------------
; Start.
;
\start: movem.l d0-a6,-(sp)
move.l a0,a4
move.l a3,a0
CALL_ RemoveLVLabels
move.l 4.w,a6
\loop: move.l a4,a0
jsr -258(a6) ;RemHead()
tst.l d0
beq.s \done
move.l d0,a0
CALL_ FreeLVNode
bra.s \loop
\done: movem.l (sp)+,d0-a6
rts
ENDIF
;------------------
;------------------------------------------------------------------------------
*
* FreeLVNode Free a previously generated listview node.
*
* INPUT: a0 Node.
*
;------------------------------------------------------------------------------
;------------------
IFD xxx_FreeLVNode
FreeLVNode:
;------------------
; Start.
;
\start: movem.l d0-a6,-(sp)
move.l 10(a0),a2
\loop: tst.b (a2)+
bne.s \loop
move.l a2,d0
sub.l a0,d0 ;size: from node to end of string
move.l a0,a1
move.l 4.w,a6
jsr -210(a6) ;FreeMem()
movem.l (sp)+,d0-a6
rts
ENDIF
;------------------
;------------------------------------------------------------------------------
*
* AddHeadLVNode Add a listview node at the head of the list.
*
* INPUT: a0 List.
* a1 Node.
* a2 WindowKey.
* a3 Gadget.
*
;------------------------------------------------------------------------------
;------------------
IFD xxx_AddHeadLVNode
AddHeadLVNode:
;------------------
; Start.
;
\start: movem.l d0-a6,-(sp)
move.l a0,a4
move.l a3,a0
CALL_ RemoveLVLabels
move.l a4,a0
move.l 4.w,a6
jsr -240(a6) ;AddHead()
move.l a4,d0
CALL_ SetLVLabels
movem.l (sp)+,d0-a6
rts
ENDIF
;------------------
;------------------------------------------------------------------------------
*
* AddTailLVNode Add a listview node at the tail of the list.
*
* INPUT: a0 List.
* a1 Node.
* a2 WindowKey.
* a3 Gadget.
*
;------------------------------------------------------------------------------
;------------------
IFD xxx_AddTailLVNode
AddTailLVNode:
;------------------
; Start.
;
\start: movem.l d0-a6,-(sp)
move.l a0,a4
move.l a3,a0
CALL_ RemoveLVLabels
move.l a4,a0
move.l 4.w,a6
jsr -246(a6) ;AddTail()
move.l a4,d0
move.l a3,a0
CALL_ SetLVLabels
movem.l (sp)+,d0-a6
rts
ENDIF
;------------------
;------------------------------------------------------------------------------
*
* RemHeadLVNode Remove first node of a listview gadget.
*
* INPUT: a0 List.
* a1 Node.
* a2 WindowKey.
* a3 Gadget.
*
;------------------------------------------------------------------------------
;------------------
IFD xxx_RemHeadLVNode
RemHeadLVNode:
;------------------
; Start.
;
\start: pea (a1)
move.l (a0),a1
tst.l (a1) ;empty?
beq.s \done
CALL_ RemoveLVNode
\done: move.l (sp)+,a1
rts
ENDIF
;------------------
;------------------------------------------------------------------------------
*
* RemTailLVNode Remove last node of a listview gadget.
*
* INPUT: a0 List.
* a1 Node.
* a2 WindowKey.
* a3 Gadget.
*
;------------------------------------------------------------------------------
;------------------
IFD xxx_RemTailLVNode
RemTailLVNode:
;------------------
; Start.
;
\start: pea (a1)
move.l 8(a0),a1
tst.l 4(a1) ;empty?
beq.s \done
CALL_ RemoveLVNode
\done: move.l (sp)+,a1
rts
ENDIF
;------------------
;------------------------------------------------------------------------------
*
* RemoveLVNode Remove a listview node from the gadget.
*
* INPUT: a0 List.
* a1 Node.
* a2 WindowKey.
* a3 Gadget.
*
;------------------------------------------------------------------------------
;------------------
IFD xxx_RemoveLVNode
RemoveLVNode:
;------------------
; Start.
;
\start: movem.l d0-a6,-(sp)
move.l a0,a4
move.l a3,a0
CALL_ RemoveLVLabels
move.l 4.w,a6
jsr -252(a6) ;Remove()
exg.l a4,d0
move.l a3,a0
CALL_ SetLVLabels
movem.l (sp)+,d0-a6
rts
ENDIF
;------------------
;--------------------------------------------------------------------
*
* ActivateGadget Activate a gadget.
*
* INPUT: a0 Gadget.
* a2 WindowKey.
*
;--------------------------------------------------------------------
;------------------
IFD xxx_ActivateGadget
ActivateGadget:
movem.l d0-a6,-(sp)
move.l (a2),a1
suba.l a2,a2
move.l gtf_intbase(pc),a6
jsr -462(a6) ;ActivateGadget()
movem.l (sp)+,d0-a6
rts
ENDIF
;------------------
;--------------------------------------------------------------------
*
* OnMenu Activate or deactivate menu strip, title, item or subitem.
* OffMenu
*
* INPUT: d0 *_mn ID number of object.
* a2 WindowKey.
*
;--------------------------------------------------------------------
;------------------
IFD xxx_OnMenu
OnMenu: movem.l d0-a6,-(sp)
move.l (a2),a0
move.l gtf_intbase(pc),a6
jsr -192(a6) ;OnMenu()
movem.l (sp)+,d0-a6
rts
ENDIF
;------------------
IFD xxx_OffMenu
OffMenu:
movem.l d0-a6,-(sp)
move.l (a2),a0
move.l gtf_intbase(pc),a6
jsr -180(a6) ;OffMenu()
movem.l (sp)+,d0-a6
rts
ENDIF
;------------------
;--------------------------------------------------------------------
*
* Different Gadget modification routines.
*
* INPUT: a0 Gadget.
* d0 Tag data.
* a2 WindowKey.
*
* RESULT: d1 Tag number.
*
;--------------------------------------------------------------------
;------------------
IFD xxx_EnableGadget
EnableGadget:
xxx_SetGadgetTag SET 1
move.l #GA_Disabled,d1
moveq #0,d0
bra SetGadgetTag
ENDIF
IFD xxx_DisableGadget
DisableGadget:
xxx_SetGadgetTag SET 1
move.l #GA_Disabled,d1
moveq #-1,d0
bra SetGadgetTag
ENDIF
IFD xxx_RemoveLVLabels
RemoveLVLabels:
xxx_SetGadgetTag SET 1
move.l #GTLV_Labels,d1
moveq #-1,d0
bra SetGadgetTag
ENDIF
IFD xxx_ChangeLVLabels
ChangeLVLabels:
xxx_SetLVLabels SET 1
move.l d0,-(sp)
CALL_ RemoveLVLabels
move.l (sp)+,d0
ENDIF
IFD xxx_SetLVLabels
SetLVLabels:
xxx_SetGadgetTag SET 1
move.l #GTLV_Labels,d1
bra SetGadgetTag
ENDIF
IFD xxx_SetCYActive
SetCYActive:
xxx_SetGadgetTag SET 1
move.l #GTCY_Active,d1
bra SetGadgetTag
ENDIF
IFD xxx_GetLVLabel
GetLVLabel:
movem.l d1/a0,-(sp)
move.w d0,d1
move.l (a0),d0
\loop: move.l d0,a0
move.l (a0),d0
beq.s \no
subq.w #1,d1
bhs.s \loop
move.l a0,d0
\no: tst.l d0
movem.l (sp)+,d1/a0
rts
ENDIF
;------------------
;--------------------------------------------------------------------
*
* SetGadgetTag Call GT_SetGadgetAttrs with one tag.
*
* INPUT: a0 Gadget
* d0 Tag data
* d1 Tag Number
* a2 WindowKey.
*
;--------------------------------------------------------------------
;------------------
IFD xxx_SetGadgetTag
SetGadgetTag:
xxx_gtf_tagspace SET 1
;------------------
; Do!
;
\do: movem.l d0-a6,-(sp)
move.l gfw_window(a2),a1
suba.l a2,a2
lea gtf_tagspace+12(pc),a3
clr.l -(a3)
move.l d0,-(a3)
move.l d1,-(a3)
move.l gtf_gadtoolsbase(pc),a6
jsr -42(a6) ;GT_SetGadgetAttrsA()
movem.l (sp)+,d0-a6
rts
ENDIF
;------------------
;--------------------------------------------------------------------
*
* FindLVNode Find Listview node.
* FindLVNodeMsg Find Listview node that is stated in gfw_msgcode.
*
* INPUT: a0 List.
* d0 Number.
* a2 WindowKey (only for FindLVNodeMsg).
*
* RESULT: d0 Node or 0.
* a0 Same as d0.
* ccr On d0.
*
;--------------------------------------------------------------------
;------------------
IFD xxx_FindLVNodeMsg
move.w gfw_msgcode(a2),d0
xxFindLVNode SET 1
ENDC
;------------------
IFD xxx_FindLVNode
FindLVNode:
;------------------
; Do!
;
\do: move.l (a0),a0
\loop: tst.l (a0)
beq.s \notfound
tst.w d0
beq.s \found
subq.w #1,d0
move.l (a0),a0
bra.s \loop
\found: move.l a0,d0
rts
\notfound:
moveq #0,d0
rts
ENDC
;--------------------------------------------------------------------
*
* Historyfunction for Stringgadgets.
*
* You'll need to declare this with 'NEED_ StringHistoryHookFunction'
*
;--------------------------------------------------------------------
;------------------
IFD xxx_StringHistoryHookFunction
rsreset
gtfh_buffer rs.l 1
gtfh_buflen rs.l 1
gtfh_bufusage rs.l 1
gtfh_start rs.l 1
gtfh_counter rs.l 1
gtfh_current rs.l 1
gtfh_SIZEOF rsval
;
; HistoryHook_ StringHistStruct
;
HistoryHook_ MACRO
dc.l 0,0
dc.l StringHistoryHookFunction
dc.l 0
dc.l \1
ENDM
;
; StringHistoryStruct_ Buffer,BufferSize
;
StringHistoryStruct_ MACRO
dc.l \1
dc.l \2
dc.l 0,0,0,0
ENDM
StringHistoryHookFunction:
;------------------
; Hook.
;
; A0 - pointer to hook itself
; A1 - pointer to parameter packet ("message")
; A2 - Hook specific address data ("object," e.g, gadget )
;
\start: moveq #0,d0
cmp.l #SGH_KEY,(a1)
bne.s \done
movem.l d3/a3/a4,-(sp)
move.l 16(a0),a3
move.l sgw_Actions(a2),d3
btst #SGAB_END,d3
bne.s \remember
move.l sgw_IEvent(a2),a4
cmp.b #$4c,7(a4)
beq.s \prev
cmp.b #$4d,7(a4)
beq.s \next
\no: movem.l (sp)+,d3/a3/a4
\done: rts
\remember:
bsr.s \addtohist
\do: moveq #-1,d0
bra.s \no
\prev: bsr \historyrew
bra.s \do
\next: bsr \historyfwd
bra.s \do
;------------------
; Add to history buffer
;
; a3: History Info Block.
; a2: SGWork.
;
\addtohist:
movem.l d0/d1/d7/a0/a1/a4/a5,-(sp)
move.l gtfh_buffer(a3),a4 ;start of buffer
move.l a4,a5
move.l gtfh_buflen(a3),d7 ;length of buffer
add.l d7,a5 ;end of buffer
moveq #0,d0
move.w sgw_NumChars(a2),d0
beq.s \fin
move.w #254,d1
cmp.w d1,d0
bls.s 1$
move.w d1,d0 ;limit to 254+1 (for len)
1$: move.l gtfh_bufusage(a3),d1
add.l d0,d1
addq.l #1,d1
cmp.l d7,d1
bls.s \norem
move.l a4,a0 ;free last entry and try again
add.l gtfh_start(a3),a0
moveq #0,d1
move.b (a0),d1
add.l d1,a0
bsr.s \historylimit
sub.l a4,a0
move.l a0,gtfh_start(a3)
sub.l d1,gtfh_bufusage(a3)
subq.l #1,gtfh_counter(a3)
bra.s 1$
\norem: addq.l #1,gtfh_counter(a3)
move.l a4,a0
add.l gtfh_bufusage(a3),a0
add.l gtfh_start(a3),a0
move.l d1,gtfh_bufusage(a3)
bsr.s \historylimit
move.b d0,(a0)
addq.b #1,(a0)+
move.l sgw_WorkBuffer(a2),a1
\loop: bsr.s \historylimit
move.b (a1)+,(a0)+
subq.b #1,d0
bne.s \loop
\fin: clr.l gtfh_current(a3)
movem.l (sp)+,d0/d1/d7/a0/a1/a4/a5
rts
\historylimit:
cmp.l a4,a0
bhs.s \nl1
add.l d7,a0
\nl1: cmp.l a5,a0
blo.s \nl2
sub.l d7,a0
\nl2: rts
;------------------
; Go one forth in command history.
; If nothing to go forth, clear line.
;
\historyfwd:
tst.l gtfh_current(a3)
beq.s \gethistory
subq.l #1,gtfh_current(a3)
bra.s \gethistory
\historyrew:
addq.l #1,gtfh_current(a3)
\gethistory:
movem.l d0/d1/d7/a4/a5/a1,-(sp)
move.l gtfh_buffer(a3),a4 ;start of buffer
move.l a4,a5
move.l gtfh_buflen(a3),d7 ;length of buffer
add.l d7,a5 ;end of buffer
move.l sgw_WorkBuffer(a2),a1
move.l gtfh_current(a3),d1
beq.s \cls
move.l gtfh_counter(a3),d0
beq.s \cls
cmp.l d0,d1
bls.s 11$
move.l d0,d1
11$: move.l d1,gtfh_current(a3)
move.l a4,a0
add.l gtfh_start(a3),a0
sub.l d1,d0
beq.s \got
\loop3: moveq #0,d1
move.b (a0),d1
add.l d1,a0
bsr.s \historylimit
subq.l #1,d0
bne.s \loop3
\got: moveq #0,d1
move.b (a0)+,d1
subq.l #1,d1
clr.w sgw_BufferPos(a2)
move.w d1,sgw_NumChars(a2)
beq.s \done2
\loop2: bsr.s \historylimit
move.b (a0)+,(a1)+
subq.w #1,d1
bne.s \loop2
\done2: clr.b (a1)
movem.l (sp)+,d0/d1/d7/a4/a5/a1
rts
\cls: clr.w sgw_NumChars(a2)
clr.w sgw_BufferPos(a2)
bra.s \done2
ENDC
;--------------------------------------------------------------------
;------------------
endif
end